home *** CD-ROM | disk | FTP | other *** search
/ Deutsche Edition 1 / Deutsche Edition 1.iso / amok / amok_lha / amok82.lha / Printf1.4 / SPrintf.s < prev    next >
Text File  |  1993-08-15  |  4KB  |  133 lines

  1. ; :Program.       SPrintf.s
  2. ; :Author.        Volker Rudolph
  3. ; :Address.       Lettow-Vorbeck-Str. 11 / 6750 Kaiserslautern 26
  4. ; :Phone.         06301/8566
  5. ; :Version.       1.0
  6. ; :Date.          28.11.1989
  7. ; :Copyright.     PD
  8. ; :Language.      Assembler / Oberon
  9. ; :Translator.    A68k(Freeware) / Amiga-Oberon V1.17.1
  10. ; :Contents.      Allzweck-Textausgabe in Form der C-Funktion Printf
  11. ; :Usage.         Aufruf und Parameter wie in C
  12. ;
  13. ; Angepasst an 2.20 (Offene Feld-Parameter jetzt .l)
  14.  
  15. _LVORawDoFmt  EQU -522            ; Exec.RawDoFmt
  16.  
  17.   XREF OberonLib.StackChk
  18.   XDEF Printf.SPrintf0,Printf.SPrintf1,Printf.SPrintf2,Printf.SPrintf3,
  19.   XDEF Printf.SPrintf4,Printf.SPrintf5,Printf.SPrintf6,Printf_SPrintf
  20.  
  21.   SECTION Module,CODE
  22.  
  23. Printf.SPrintf0:
  24.   moveq   #0,d7
  25.   bra.s   Printf_SPrintf
  26. Printf.SPrintf1:
  27.   moveq   #1,d7
  28.   bra.s   Printf_SPrintf
  29. Printf.SPrintf2:
  30.   moveq   #2,d7
  31.   bra.s   Printf_SPrintf
  32. Printf.SPrintf3:
  33.   moveq   #3,d7
  34.   bra.s   Printf_SPrintf
  35. Printf.SPrintf4:
  36.   moveq   #4,d7
  37.   bra.s   Printf_SPrintf
  38. Printf.SPrintf5:
  39.   moveq   #5,d7
  40.   bra.s   Printf_SPrintf
  41. Printf.SPrintf6:
  42.   moveq   #6,d7
  43. ;  bra.s   Printf_SPrintf
  44.  
  45. ;--------------------------------------------------------------------
  46.  
  47. ; Register-Belegungen
  48.  
  49. OFFS      EQUR d6                   ; Gesamtlänge der val-Parameter
  50. HIGHS     EQUR d4                   ; HIGH(str)
  51. INDEX     EQUR d3                   ; INDEX für diverse dbra-Schleifen
  52.  
  53. HELP      EQUR a4                   ; Hilfs-Pointer
  54.  
  55. ; Register-Parameter (werden vom Rufer übergeben)
  56. ARGC      EQUR d7                   ; Anzahl val-Parameter
  57.  
  58. HIGHB     EQUR d5                   ; Größe des Ausgabe-Puffers
  59. PUTCHDATA EQUR a3                   ; Daten für PutChar-Prozedur
  60.  
  61. ; Parameter für RawDoFmt
  62. ;PUTCHDATA  EQUR a3 ;               ; Puffer (schon mal definiert)
  63. PROC      EQUR a2                   ; Ausgabe-Prozedur für Zeichen
  64. ARGV      EQUR a1                   ; Argument-Vektor
  65. STR       EQUR a0                   ; Format-String
  66.  
  67.   ; d7 = Anzahl val-Parameter
  68.   ; d5 = HIGH(Buffer)
  69.   ; a3 = ADR(Buffer)
  70.  
  71. Printf_SPrintf:
  72.   movem.l a5/a6,-(sp)               ; a5/a6 retten
  73.   lea     12(sp),HELP               ; Anfang val-Parameter
  74.  
  75.   move.l  ARGC,OFFS                 ; Offset über val-Parameter berechnen
  76.   lsl.l   #2,OFFS
  77.  
  78.   moveq.l   #0,HIGHS
  79.   moveq.l   #0,HIGHB
  80.  
  81.   move.l  12(sp,OFFS),HIGHS         ; HIGH(str)
  82.   move.l  16(sp,OFFS),STR           ; str (Format-String)
  83.   move.l  20(sp,OFFS),HIGHB         ; HIGH(buf)
  84.   subq.l  #8,sp
  85.   move.l  sp,PUTCHDATA
  86.   move.l  32(sp,OFFS),(PUTCHDATA)   ; buffer (24+8)
  87.  
  88. stackCheck:
  89.   move.l  OFFS,d0                   ; Stackbedarf berechnen
  90.   addq.l  #8,d0
  91.   addq.l  #8,d0
  92.   jsr     OberonLib.StackChk
  93.   tst.l   ARGC
  94.   beq.s   print
  95.  
  96. copyArgs:                           ; val-Argumente auf Stack kopieren
  97.   subq.l  #1,ARGC                   ; Sie liegen für die RawDoFmt-Routine
  98. 1$:                                 ; in der falschen Reihenfolge auf dem
  99.   move.l  (HELP)+,-(sp)             ; Stack.
  100.   dbra    ARGC,1$
  101.  
  102.   move.l  sp,ARGV                   ; Neuer Argument-Vektor
  103.  
  104. print:
  105.   move.l  (PUTCHDATA),4(PUTCHDATA)  ; Endadresse des Puffers berechnen
  106.   add.l   HIGHB,4(PUTCHDATA)
  107.  
  108.   lea     PutChProc(pc),PROC        ; Ausgabe-Prozedur für Zeichen
  109.  
  110.   move.l  4,a6                      ; Exec.RawDoFmt aufrufen
  111.   jsr     _LVORawDoFmt(a6)
  112.  
  113.   add.l   #8,sp
  114.   add.l   OFFS,sp
  115.   movem.l (sp)+,a5/a6               ; a5/a6 holen
  116.   move.l  (sp),a0
  117.   lea     20(sp),sp                 ; 4+2*(4+4)
  118.   add.l   OFFS,sp
  119.   jmp     (a0)
  120.  
  121. ; Diese Prozedur wird von RawDoFmt Aufgerufen.
  122. ; Das Zeichen das ausgegeben werden soll, ist in d0
  123. PutChProc:
  124.   move.l  (PUTCHDATA),a0
  125.   cmp.l   4(PUTCHDATA),a0           ; Ist Ausgabe-Puffer voll ?
  126.   bgt.s   1$
  127.   move.b  d0,(a0)+                  ; Nein: Zeichen in Puffer schreiben
  128.   move.l  a0,(PUTCHDATA)
  129. 1$:
  130.   rts
  131.  
  132.   END
  133.